/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.inject.Model;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import modelo.Categoria;
import modelo.Usuario;
import negocio.CategoriaBI;
import negocio.UsuarioBI;

/**
 *
 * @author Francisco
 */
@Named("editarCatCtrl")
@Model
public class EditarCategoriaCtrl {
    private Integer categoriaSeleccionada;
    private String nombreCategoria;
    private String descripcion;
    private Integer categoriaPadre;
    private String categoriaPadreNom;
    private Map<String,Integer> categoriasPadre;
    private LoginCtrl login;
    @Inject
    private UsuarioBI usuarioBI;
    @Inject
    private CategoriaBI categoriaBI;
    private Usuario usuario;
    
    @PostConstruct
    public void init(){
        try{
            login = (LoginCtrl)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("login");
            String nombreUsuario = login.getUsuario();
            usuario = usuarioBI.buscarUsuario(nombreUsuario);
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
            return;
        }
    }
    
    public void cargaCategoriasPadre(){
        try{
            if(usuario!=null){
                List<Categoria> categoriasUsu = categoriaBI.categoriasActivasPorUsuario(usuario.getIdUsuario());
                if(categoriasUsu.size()>0){
                    categoriasPadre = new HashMap<String, Integer>();
                    for (Categoria categoria : categoriasUsu) {
                        if(!categoria.getIdCategoria().equals(categoriaSeleccionada)){
                            categoriasPadre.put(categoria.getNombre(), categoria.getIdCategoria());
                        }
                    }
                }
            }else{
                throw new Exception("No hay usuario");
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
                    
    }
    
    public void cargaDatosCat(){
        try{
            if(categoriaSeleccionada==null){
                throw new Exception("No seleccionó una categoria a editar");
            }
            Categoria catSel = categoriaBI.buscarCategoria(categoriaSeleccionada);
            if(catSel==null){
                throw new Exception("No existe la categoría seleccionada");
            }
            nombreCategoria = catSel.getNombre();
            descripcion = catSel.getDescripcion();
            if(catSel.getIdCategoriaPadre()!=null){
                categoriaPadre = catSel.getIdCategoriaPadre().getIdCategoria();
                categoriaPadreNom = catSel.getIdCategoriaPadre().getNombre();
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void guardar(){
        try{
            if(categoriaSeleccionada==null){
                throw new Exception("No seleccionó una categoria a editar");
            }
            
            Categoria catAnt = categoriaBI.buscarCategoria(nombreCategoria, usuario.getIdUsuario());
            if(catAnt!=null && !catAnt.equals(categoriaSeleccionada)){
                throw new Exception("El nombre de categoria ya existe");
            }
            
            Categoria catSel = categoriaBI.buscarCategoria(categoriaSeleccionada);
            if(catSel==null){
                throw new Exception("No existe la categoría seleccionada");
            }
            if(nombreCategoria==null||nombreCategoria.equals("")){
                throw new Exception("No se capturó el nombre");
            }
            
            catSel.setNombre(nombreCategoria);
            catSel.setDescripcion(descripcion);
            Categoria catPad = null;
            if(categoriaPadre!=null){
                catPad = categoriaBI.buscarCategoria(categoriaPadre);
                if(catPad==null){
                    throw new Exception("No existe la categoría Padre seleccionada");
                }
                catSel.setIdCategoriaPadre(catPad);
            }
            categoriaBI.actualizaCategoria(catSel);
            cancelar();
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "Listo", "Guardado con éxito"));
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void cancelar(){
        categoriaSeleccionada = null;
        nombreCategoria = null;
        descripcion = null;
        categoriaPadre = null;
        categoriasPadre = null;
    }
    
    public Integer getCategoriaSeleccionada() {
        return categoriaSeleccionada;
    }

    public void setCategoriaSeleccionada(Integer categoriaSeleccionada) {
        this.categoriaSeleccionada = categoriaSeleccionada;
    }
    
    public String getNombreCategoria() {
        return nombreCategoria;
    }

    public void setNombreCategoria(String nombreCategoria) {
        this.nombreCategoria = nombreCategoria;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Integer getCategoriaPadre() {
        return categoriaPadre;
    }

    public void setCategoriaPadre(Integer categoriaPadre) {
        this.categoriaPadre = categoriaPadre;
    }

    public Map<String, Integer> getCategoriasPadre() {
        return categoriasPadre;
    }

    public String getCategoriaPadreNom() {
        return categoriaPadreNom;
    }

    public void setCategoriaPadreNom(String categoriaPadreNom) {
        this.categoriaPadreNom = categoriaPadreNom;
    }

    public void setCategoriasPadre(Map<String, Integer> categoriasPadre) {
        this.categoriasPadre = categoriasPadre;
    }

    public LoginCtrl getLogin() {
        return login;
    }

    public void setLogin(LoginCtrl login) {
        this.login = login;
    }

    public UsuarioBI getUsuarioBI() {
        return usuarioBI;
    }

    public void setUsuarioBI(UsuarioBI usuarioBI) {
        this.usuarioBI = usuarioBI;
    }
}
